1 : <?php
2 : /*--------------------------------------------------------------------------+
3 : This file is part of eStudy.
4 : roleplay/classes/class.userrolemanagement.inc.php
5 : - Modulgruppe: Roleplay
6 : - Beschreibung: Klasse zum Verwalten der Rollenzuordnungen der Teilnehmer.
7 : - Version: 0.8, 02/12/06
8 : - Autor(en): Clemens Weiß <clemens.weiss@mni.fh-giessen.de>
9 : +---------------------------------------------------------------------------+
10 : This program is free software; you can redistribute it and/or
11 : modify it under the terms of the GNU General Public License
12 : as published by the Free Software Foundation; either version 2
13 : of the License, or any later version.
14 : +---------------------------------------------------------------------------+
15 : This program is distributed in the hope that it will be useful,
16 : but WITHOUT ANY WARRANTY; without even the implied warranty of
17 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 : GNU General Public License for more details.
19 : You should have received a copy of the GNU General Public License
20 : along with this program; if not, write to the Free Software
21 : Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 : +--------------------------------------------------------------------------*/
23 : /**
24 : * Klasse zum Verwalten der Rollenzuordnungen der Teilnehmer.
25 : * @package eStudy.Roleplay
26 : * @version 0.8, 02/12/06
27 : * @author Clemens Weiß <clemens.weiss@mni.fh-giessen.de>
28 : */
29 : require_once (PATH_TO_ROOT."roleplay/classes/class.rolesetlist.inc.php");
30 : require_once (PATH_TO_ROOT."roleplay/classes/class.role.inc.php");
31 : require_once (PATH_TO_ROOT."courses/classes/class.Course.inc.php");
32 : require_once (PATH_TO_ROOT."teams/classes/class.userteammanagement.inc.php");
33 : class UserRoleManagement {
34 : /**
35 : * Enthält ein Array der in dem Kurs aktiven Rollen-Sets.
36 : * @var array
37 : * @access private
38 : */
39 : var $roleSets;
40 : /**
41 : * ID des Kurses, für den die Benutzer-Rollen verwaltet werden sollen
42 : * @var int
43 : * @access private
44 : */
45 : var $courseID;
46 : /**
47 : * Array mit den Vor- und Nachnamen aller Kurs-Mitglieder
48 : * @var array
49 : * @access private
50 : */
51 : var $users;
52 : /**
53 : * Konstruktor.
54 : * @access public
55 : * @param int $courseID ID des Kurses, für den die Benutzer-Rollen verwaltet werden sollen
56 : */
57 : function UserRoleManagement($courseID) {
58 0 : $this->courseID = (int)$courseID;
59 0 : }
60 : /**
61 : * Gibt für jede Rolle aller in diesem Kurs aktiven Rollen-Sets eine select-Box aus, in der
62 : * aus allen Kurs-Mitgliedern ausgewählt werden kann, wer der Rolle zugeordnet ist.
63 : *
64 : * @access public
65 : * @return void
66 : */
67 : function showRoleAssignmentForms() {
68 0 : $this->readUsersAndRoleSets();
69 0 : $size = count($this->users);
70 0 : if ($size > 8) $size = 8;
71 0 : $setName = "";
72 0 : foreach($this->roleSets as $roleSet) {
73 0 : if (count($this->roleSets) > 1) $setName = Data::toHTML($roleSet->getName() .": ", false);
74 0 : foreach($roleSet->roles as $role) {
75 0 : $userIDs = $this->getUsersWithRole($role->getID());
76 0 : echo "<form action='".PATH_TO_ROOT.SCRIPT_NAME."' method='post' class='roleAssignmentForm'><p>\n"."<input type='hidden' name='roleID' value='".$role->getID() ."' />\n"."<strong>$setName".$role->getPropertiesLink() ."</strong><br />\n"."<select name='users[]' size='$size' multiple='multiple'>\n";
77 0 : foreach($this->users as $userID => $userName) {
78 0 : echo "<option value='$userID'".(in_array($userID, $userIDs) ? " selected='selected'" : "") .">".Data::toHTML($userName, false) ."</option>\n";
79 0 : }
80 0 : echo "</select><br />"."<input type='submit' name='okButton' value='Speichern' /> "."<input type='reset' value='Auswahl zurücksetzen' />"."</p></form>\n";
81 0 : }
82 0 : }
83 0 : }
84 : /**
85 : * Gibt die IDs der Benutzer zurück, die die übergebene Rolle innehaben.
86 : * Ob der Benutzer gerade in dieser Rolle aktiv ist, wird hier nicht überprüft.
87 : *
88 : * @access public
89 : * @param int $roleID ID der Rolle, für die die Benutzer zurückgegeben werden sollen
90 : * @return mixed Array mit den Benutzer-IDs (int) oder false, falls die Rollen-ID ungültig ist
91 : */
92 : function getUsersWithRole($roleID) {
93 0 : global $db, $settings;
94 0 : $dbp = $settings["dbPrefix"];
95 0 : if (!is_integer($roleID) || $roleID <= 0) {
96 0 : return false;
97 : }
98 0 : $userIDs = $db->get_col("SELECT user_id FROM {$dbp}user_roles JOIN {$dbp}user ON user_id=ID WHERE role_id='$roleID' ORDER BY Nachname, Vorname");
99 0 : if (is_array($userIDs)) {
100 0 : $userIDs = array_map("intval", $userIDs);
101 0 : return $userIDs;
102 : } else {
103 0 : return array();
104 : }
105 : }
106 : /**
107 : * Ordnet alle im Array angegebenen Benutzer-IDs der angegebenen Rolle zu.
108 : * Bestehende Zuordnungen von Benutzern, die nicht im Array enthalten sind,
109 : * werden gelöscht.
110 : *
111 : * @access public
112 : * @param int $roleID ID der Rolle, zu der die Benutzer zugeordnet werden sollen
113 : * @param array $users Array von Benutzer-IDs, die der Rolle zugeordnet werden sollen
114 : * @return boolean Erfolgswert
115 : */
116 : function assignUsersToRole($roleID, $users) {
117 0 : $this->readUsersAndRoleSets();
118 0 : global $db, $settings, $EZSQL_ERROR;
119 0 : $dbp = $settings["dbPrefix"];
120 0 : if (!is_integer($roleID) || $roleID <= 0 || !is_array($users)) {
121 0 : return false;
122 : }
123 0 : $roleInSet = false;
124 0 : foreach($this->roleSets as $roleSet) {
125 0 : foreach($roleSet->roles as $role) {
126 0 : if ($roleID == $role->getID()) {
127 0 : $roleInSet = true;
128 0 : break;
129 : }
130 0 : }
131 0 : if ($roleInSet) break;
132 0 : }
133 0 : if (!$roleInSet) {
134 : // Rolle gehört zu keinem hier aktiven Set
135 0 : return false;
136 : }
137 0 : $users = array_map("intval", $users);
138 0 : if (count(array_diff($users, array_keys($this->users)))) {
139 : // einer der Benutzer ist nicht Mitglied dieses Kurses
140 0 : return false;
141 : }
142 0 : $oldUsers = $this->getUsersWithRole($roleID);
143 0 : $insert = array_diff($users, $oldUsers);
144 0 : $delete = array_diff($oldUsers, $users);
145 0 : $errorCount = count($EZSQL_ERROR);
146 0 : if (count($insert)) {
147 0 : $db->query("INSERT INTO {$dbp}user_roles (user_id, role_id) VALUES ('".implode("', '$roleID'), ('", $insert) ."', '$roleID')");
148 0 : }
149 0 : if (count($delete)) {
150 0 : $db->query("DELETE FROM {$dbp}user_roles WHERE user_id IN (".implode(", ", $delete) .") AND role_id='$roleID'");
151 0 : }
152 0 : if (RoleSetList::roleplayForced($this->courseID)) {
153 0 : foreach($insert as $userID) {
154 0 : if ($this->getRolesOfUser($userID, true) == array()) {
155 0 : $this->setActiveUserRole($userID, $roleID);
156 0 : }
157 0 : }
158 0 : }
159 0 : if (count($EZSQL_ERROR) > $errorCount) return false;
160 0 : return true;
161 : }
162 : /**
163 : * Ordnet eine Rolle einem User zu.
164 : *
165 : * @access public
166 : * @param int $userID User-ID
167 : * @param int $roleID Rollen-ID
168 : * @param bool $setActive Gibt an, ob die neue Rolle auch aktiv gesetzt werden soll.
169 : * @return bool Erfolgswert
170 : */
171 : function setRoleForUser($userID, $roleID, $setActive = false) {
172 0 : global $db, $settings, $EZSQL_ERROR;
173 0 : $dbp = $settings["dbPrefix"];
174 0 : if (!is_integer($userID) || $userID <= 0 || !is_integer($roleID) || $roleID <= 0) {
175 0 : return false;
176 : }
177 0 : $result = true;
178 0 : $userIDs = $this->getUsersWithRole($roleID);
179 0 : if ($userIDs === false) {
180 0 : return false;
181 : }
182 0 : if (!in_array($userID, $userIDs)) {
183 0 : $errorCount = count($EZSQL_ERROR);
184 0 : $db->query("INSERT INTO {$dbp}user_roles (user_id, role_id) VALUES ('$userID', '$roleID')");
185 0 : $result = $errorCount == count($EZSQL_ERROR);
186 0 : }
187 0 : if ($result && $setActive) {
188 0 : $result = $this->setActiveUserRole($userID, $roleID);
189 0 : }
190 0 : return $result;
191 : }
192 : /**
193 : * Entfernt die Rollenzuordnung eines Users.
194 : *
195 : * @access public
196 : * @param int $userID User-ID
197 : * @param int $roleID Rollen-ID
198 : * @return bool Erfolgswert
199 : */
200 : function unsetRoleForUser($userID, $roleID) {
201 0 : global $db, $settings, $EZSQL_ERROR;
202 0 : $dbp = $settings["dbPrefix"];
203 0 : if (!is_integer($userID) || $userID <= 0 || !is_integer($roleID) || $roleID <= 0) {
204 0 : return false;
205 : }
206 0 : $result = true;
207 0 : $errorCount = count($EZSQL_ERROR);
208 0 : $db->query("DELETE FROM {$dbp}user_roles WHERE user_id='$userID' AND role_id='$roleID'");
209 0 : $result = $errorCount == count($EZSQL_ERROR);
210 0 : if ($result && RoleSetList::roleplayForced($this->courseID)) {
211 0 : $roles = $this->getRolesOfUser($userID);
212 0 : if (!empty($roles)) {
213 0 : $active = false;
214 0 : foreach($roles as $role) {
215 0 : if ($role["isActive"]) {
216 0 : $active = true;
217 0 : break;
218 : }
219 0 : }
220 0 : if (!$active) {
221 0 : $role = array_pop($roles);
222 0 : $this->setActiveUserRole($userID, $role["role"]->getID());
223 0 : }
224 0 : }
225 0 : }
226 0 : return $result;
227 : }
228 : /**
229 : * Gibt die dem angegebenen Benutzer zugewiesenen Rollen in einem Array zurück.
230 : *
231 : * @access public
232 : * @param int $userID ID des Benutzers, dessen Rollen zurückgegeben werden sollen
233 : * @return mixed Zweidimensionales Array mit der Rollen-ID als Schlüssel und den Werten isActive und dem Rollenobjekt role
234 : * oder false bei ungültiger User-ID
235 : */
236 : function getRolesOfUser($userID, $onlyActive = false) {
237 0 : global $db, $settings;
238 0 : $dbp = $settings["dbPrefix"];
239 0 : if (!is_integer($userID) || $userID <= 0) {
240 0 : return false;
241 : }
242 0 : $whereActive = "";
243 0 : if ($onlyActive) {
244 0 : $whereActive = "AND {$dbp}user_roles.is_active=1 ";
245 0 : }
246 0 : $sql = "SELECT role_id, {$dbp}user_roles.is_active "."FROM {$dbp}user_roles JOIN {$dbp}roles ON {$dbp}roles.id=role_id JOIN {$dbp}rolesets ON {$dbp}rolesets.id=set_id "."WHERE user_id='$userID' AND {$dbp}rolesets.is_active=1 AND course_id='$this->courseID' $whereActive"."ORDER BY {$dbp}rolesets.name, {$dbp}roles.name";
247 0 : $roles = $db->get_results($sql);
248 0 : if ($db->num_rows) {
249 0 : foreach($roles as $role) {
250 0 : $arr[(int)$role->role_id]["isActive"] = (bool)$role->is_active;
251 0 : $arr[(int)$role->role_id]["role"] = new Role((int)$role->role_id);
252 0 : }
253 0 : return $arr;
254 : } else {
255 0 : return array();
256 : }
257 : }
258 : /**
259 : * Zeigt das Formular an, mit dem der Benutzer eine der ihm zugewiesenen Rollen aktivieren kann.
260 : *
261 : * @access public
262 : * @param int $userID ID des Benutzers, dessen Rollen ausgegeben werden sollen
263 : * @return void
264 : */
265 : function showUserRoleForm($userID) {
266 0 : if (!is_integer($userID) || $userID <= 0) {
267 0 : return false;
268 : }
269 0 : $roles = $this->getRolesOfUser($userID);
270 0 : if (empty($roles)) {
271 0 : echo "<p>Ihnen ist derzeit keine Rolle zugeordnet.</p>";
272 0 : } else {
273 0 : $noActive = true;
274 0 : $sets = 0;
275 0 : $lastSetName = "";
276 0 : foreach($roles as $role) {
277 0 : if ($role["isActive"]) {
278 0 : $noActive = false;
279 0 : }
280 0 : if ($lastSetName != $role["role"]->getSetName()) $sets++;
281 0 : $lastSetName = $role["role"]->getSetName();
282 0 : }
283 0 : echo "<p>Ihnen sind derzeit folgende Rollen zugeordnet.<br />Bitte wählen Sie aus, welche Sie bis zur nächsten Änderung in diesem Kurs einnehmen wollen:</p>\n";
284 0 : echo "<form action='".PATH_TO_ROOT.SCRIPT_NAME."' method='post' id='userRoleForm'>\n"."<ul>\n";
285 0 : if (!RoleSetList::roleplayForced($this->courseID)) {
286 0 : echo "<li id='noRole'><input type='radio' name='roleID' id='role0' value='0' ".($noActive ? "checked='checked' " : "") ."/> <label for='role0'>keine</label></li>\n";
287 0 : }
288 0 : foreach($roles as $roleID => $role) {
289 0 : $roleName = $role["role"]->getName($_SESSION["gender"]);
290 0 : if ($sets > 1) $roleName = $role["role"]->getSetName() .": ".$roleName;
291 0 : echo "<li><input type='radio' name='roleID' id='role$roleID' value='$roleID' ".($role["isActive"] ? "checked='checked' " : "") ."/> ".$role["role"]->getPropertiesLink($role["role"]->getIcon()) ." <label for='role$roleID'>".Data::toHTML($roleName, false) ."</label></li>\n";
292 0 : }
293 0 : echo "</ul>\n"."<br /><input type='submit' name='okButton' value='Rolle übernehmen' />\n"."</form>\n";
294 : }
295 0 : }
296 : /**
297 : * Setzt die angegebene Rolle für den Benutzer aktiv, alle anderen inaktiv.
298 : * Wird 0 als Rollen-ID übergeben, werden alle Rollen des Benutzers auf inaktiv gesetzt
299 : *
300 : * @access public
301 : * @param int $userID ID des Benutzers, dessen Rolle gesetzt werden soll
302 : * @param int $roleID ID der Rolle, die für den Benutzer aktiv gesetzt werden soll
303 : * @return bool Erfolgswert
304 : */
305 : function setActiveUserRole($userID, $roleID) {
306 0 : global $db, $settings, $EZSQL_ERROR;
307 0 : $dbp = $settings["dbPrefix"];
308 0 : if (!is_integer($userID) || $userID <= 0 || !is_integer($roleID) || $roleID < 0) {
309 0 : return false;
310 : }
311 0 : $roleIDs = array_keys($this->getRolesOfUser($userID));
312 0 : if (!in_array($roleID, $roleIDs) && $roleID > 0 || RoleSetList::roleplayForced($this->courseID) && $roleID == 0) {
313 0 : return false;
314 : }
315 0 : $errorCount = count($EZSQL_ERROR);
316 0 : $db->query("UPDATE {$dbp}user_roles SET is_active=0 WHERE user_id='$userID' AND role_id IN (".implode(", ", $roleIDs) .")");
317 0 : if ($roleID > 0) {
318 0 : $db->query("UPDATE {$dbp}user_roles SET is_active=1 WHERE user_id='$userID' AND role_id='$roleID'");
319 0 : }
320 0 : if (count($EZSQL_ERROR) > $errorCount) {
321 0 : return false;
322 : }
323 0 : return true;
324 : }
325 : /**
326 : * Gibt eine Übersicht der Teilnehmer und den ihnen zugeordneten Rollen in Listenform aus.
327 : *
328 : * @access public
329 : * @return void
330 : */
331 : function showUsersOverview() {
332 0 : $utm = new UserTeamManagement($this->courseID);
333 0 : $this->readUsersAndRoleSets();
334 0 : echo "<ul class='rolesOverview'>\n";
335 0 : foreach($this->users as $userID => $userName) {
336 0 : echo "<li><a href='".PATH_TO_ROOT."user/homepage.php?user=$userID'>".Data::toHTML($userName, false) ."</a>";
337 0 : if ($team = $utm->getTeamOfUser((int)$userID)) {
338 0 : echo " (".Data::toHTML($team->getName(), false) .")";
339 0 : }
340 0 : if ($roles = $this->getRolesOfUser($userID)) {
341 0 : echo "<ul>";
342 0 : foreach($roles as $role) {
343 0 : echo "<li>".$role["role"]->getPropertiesLink();
344 0 : if (count($this->roleSets)) echo " (".Data::toHTML($role["role"]->getSetName(), false) .")";
345 0 : if ($role["isActive"]) echo " (aktiv)";
346 0 : echo "</li>\n";
347 0 : }
348 0 : echo "</ul>\n";
349 0 : }
350 0 : echo "</li>\n";
351 0 : }
352 0 : echo "</ul>\n";
353 0 : }
354 : /**
355 : * Gibt eine Übersicht der Rollen und den zugeordneten Teilnehmern in Listenform aus.
356 : *
357 : * @access public
358 : * @return void
359 : */
360 : function showRolesOverview() {
361 0 : $utm = new UserTeamManagement($this->courseID);
362 0 : $this->readUsersAndRoleSets();
363 0 : echo "<ul class='rolesOverview'>\n";
364 0 : $setName = "";
365 0 : foreach($this->roleSets as $roleSet) {
366 0 : if (count($this->roleSets) > 1) $setName = Data::toHTML($roleSet->getName() .": ", false);
367 0 : foreach($roleSet->roles as $role) {
368 0 : echo "<li>$setName".$role->getPropertiesLink();
369 0 : if ($userIDs = $this->getUsersWithRole($role->getID())) {
370 0 : echo "<ul>";
371 0 : foreach($userIDs as $userID) {
372 0 : echo "<li><a href='".PATH_TO_ROOT."user/homepage.php?user=$userID'>".Data::toHTML($this->users[$userID], false) ."</a>";
373 0 : if ($team = $utm->getTeamOfUser((int)$userID)) {
374 0 : echo " (".Data::toHTML($team->getName(), false) .")";
375 0 : }
376 0 : echo "</li>\n";
377 0 : }
378 0 : echo "</ul>\n";
379 0 : }
380 0 : echo "</li>\n";
381 0 : }
382 0 : }
383 0 : echo "</ul>";
384 0 : }
385 : /**
386 : * Bei Bedarf werden die Benutzer des Kurses und die aktiven Rollen-Sets ausgelesen.
387 : * Aus Performance-Gründen passiert das nicht im Konstruktor.
388 : *
389 : * @access private
390 : * @return void
391 : */
392 : function readUsersAndRoleSets() {
393 0 : if (!isset($this->roleSets)) {
394 0 : $this->roleSets = RoleSetList::getRoleSets($this->courseID, true);
395 0 : }
396 0 : if (!isset($this->users)) {
397 0 : $this->users = array();
398 0 : $users = Course::getParticipants($this->courseID, "all", "user.Nachname, user.Vorname");
399 0 : if (is_array($users)) {
400 0 : foreach($users as $user) {
401 0 : $this->users[$user->userid] = "$user->lastname, $user->firstname";
402 0 : }
403 0 : }
404 0 : }
405 0 : }
406 : }
|